package com.dragon.common.modules.uaa.service.def;


import com.dragon.common.modules.uaa.web.models.params.CompleteAccountParam;
import com.dragon.common.modules.uaa.web.models.results.UserInfoResult;

import java.util.List;

/**
 * @author Chris Chan
 * Create On 2025/7/25 下午8:40
 * Use for: 账号服务
 * Explain:
 * 需要授权
 */
public interface AccountService<E> {

    /**
     * 用户名密码注册
     *
     * @param username 用户名
     * @param password 密码
     */
    void addAccountWithUsernamePassword(String username, String password);

    /**
     * 手机号注册
     *
     * @param mobile 手机号
     */
    void addAccountWithMobileVerifyCode(String mobile);

    /**
     * 邮箱注册
     *
     * @param email 邮箱
     */
    void addAccountWithEmailVerifyCode(String email);

    /**
     * 用户名查询用户
     *
     * @param username 用户名
     * @return 用户
     */
    E findAccountByUsername(String username);

    /**
     * 手机号查询用户
     *
     * @param mobile 手机号
     * @return 用户
     */
    E findAccountByMobile(String mobile);

    /**
     * 邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户
     */
    E findAccountByEmail(String email);

    /**
     * 重置密码
     *
     * @param account 用户
     */
    void resetPassword(E account);

    /**
     * 激活账号
     * 提供给AuthAccountService
     *
     * @param activationCode 激活码
     * @return 是否激活成功
     */
    boolean activateAccount(String activationCode);

    /**
     * 完善账号
     * 参数太多了
     *
     * @param param 完善账号参数
     * @return
     */
    boolean completeAccount(CompleteAccountParam param);

    /**
     * 通过手机号验证码修改密码
     *
     * @param mobile          手机号
     * @param verifyCode      验证码
     * @param newPassword     新密码
     * @param confirmPassword 确认密码
     * @return 是否修改成功
     */
    boolean updatePasswordByMobileVerifyCode(String mobile, String verifyCode, String newPassword, String confirmPassword);

    /**
     * 通过邮箱验证码修改密码
     *
     * @param email           邮箱
     * @param verifyCode      验证码
     * @param newPassword     新密码
     * @param confirmPassword 确认密码
     * @return 是否修改成功
     */
    boolean updatePasswordByEmailVerifyCode(String email, String verifyCode, String newPassword, String confirmPassword);


    /**
     * 退出登录
     *
     * @return 是否退出成功
     */
    boolean logout();

    /**
     * 创建用户角色关联
     *
     * @param accountCode 用户编码
     * @param roleCode    角色编码
     */
    void createAccountRole(Long accountCode, Long roleCode);

    /**
     * 更新用户角色关联
     *
     * @param accountCode 用户编码
     * @param roleCodes   角色编码
     */
    boolean updateAccountRole(Long accountCode, List<Long> roleCodes);

    /**
     * 获取当前登录用户的编码
     *
     * @return 当前登录用户的编码
     */
    Long getCurrentAccountCode();

    /**
     * 获取当前登录用户的权限列表
     *
     * @return 当前登录用户的权限列表
     */
    List<String> getCurrentAccountAuthorities();

    /**
     * 获取当前登录用户的信息
     *
     * @return 当前登录用户的信息
     */
    UserInfoResult getUserInfo();
}
